"""
   1：函数
"""
def func1():
    print("这是第一个函数")
func1()

def func2():
    return "success"
print("返回一个值：" , type(func2()), func2()) # >>> 返回一个值： <class 'str'> success

def func3():
    return "001", "success"
print("返回多个值", type(func3()), func3(), func3()[0]) # >>> 返回多个值 <class 'tuple'> ('001', 'success') 001

def func4():
    return {"A":1, "B":2, "C":3}
print("返回字典dict", type(func4()), func4(), func4()["A"]) # >>> 返回字典dict <class 'dict'> {'A': 1, 'B': 2, 'C': 3} 1

"""
    形参函数 参数必传，不传报错
"""
def add(a, b):
    if not b:
        b = 0
    return a + b
print("a[%s] + b[%s] = %s" % (1, 2, add(1, 2))) # >>> a[1] + b[2] = 3
print("a[%s] + b[%s] = %s" % (1, "", add(1, ""))) # >>> a[1] + b[] = 1

"""
    默认参数 默认参数必须放在位置参数后面，不然编译不通过
"""
def add(a, b=0):
    return a + b
print("a[%s] + b[%s] = %s" % (1, 0, add(1))) # >>> a[1] + b[0] = 1

def func5(a, b = 0, c = 0):
    return a + b - c

print(func5(100, 200)) # >>> 300
print(func5(100, c=200)) # >>> -100
print(func5(100, c=200, b=100)) # >>> 0

"""
    可变参数 (一般约定熟成 用args， 也可用别的参数)  ， 可变参数不能接收关键字参数
    
    在 Python 中，函数的参数需要按照以下顺序排列：
    1、位置参数（Positional parameters）
    2、可变位置参数（*args）
    3、默认参数（Default parameters）
    4、可变关键字参数（**kwargs）
    
    在Python中关键字参数必须在位置参数之后
    在Python中，当你调用函数时，位置参数必须出现在关键字参数之前。这意味着你不能在同一个函数调用中先指定关键字参数再指定位置参数。例如，下面的调用是非法的：
    function(name="Alice", 20)  # 错误：关键字参数之后还有位置参数
"""
def func6(*args, a = 1000):
    #print(type(args))  # >>> <class 'tuple'>
    print(args) # >>> (100, 200, 300)
    print(a) # >>> 100
    return args

#  错误写法
def func601(a = None, b =None , *args):
    print(a)  # >>> 100
    print(b)  # >>> 100
    print(args) # >>> (100, 200, 300)
    print(a) # >>> 100
#func601(a=100, b=200, *[300, 400])

print(type(func6(100, 200)) , func6(100, 200, 300, a = 100)) # >>> <class 'tuple'> (100, 200)

"""
    关键字参数
"""
def func7(**keywords):
    print(type(keywords) ,keywords) #<class 'dict'> {'a': 1, 'b': 2, 'c': 3}
    return keywords
print(func7(name="lzm", age=30))
print(func7(**{"a":1,"b":2,"c":3})) #{'a': 1, 'b': 2, 'c': 3}   // **拆包动作


#def func701(**keywords, *args):  报错


def func701(*args, **keywords):
    print(args)
    print(keywords)
func701(*(1, 2), **{"a":1,"b":2,"c":3}) # 拆包动作（*拆元组） （**拆字典）

"""
    嵌套调用
"""
def func8():
    print("func8() execute")
    func9()

def func9():
    print("func9() execute")

print(func8())

"""
    嵌套定义
"""
def func10():
    print("func10() execute")
    def func11():
        print("func11() execute")
    func11()


func10() # >>> func10() execute func11() execute

"""
    作用域：
    1：全局变量
    2：局部变量 
"""
a = 100  # 全局变量
b = 200
def func11():
    print(a)

def func12():
    a = 120 #局部变量
    b = 300
    global c # 变量作用域升级
    c = 300
    print(a)
    print(c)

func11()
func12()
print(b) # 200
print(c) # 300
c = 400
print(c) # 400

"""
    匿名函数
    lambda 只能写一个简单的表达式，不能包含多行代码或语句。如果你的函数逻辑比较复杂，无法简洁地用一个表达式表示，应该选择使用 def 来定义
    函数名 = lambda 形参： 返回值
    add = lambda a, b: a + b
"""
print((lambda : "success")()) # >>> success
print((lambda x, y: x + y)(1, 2)) # >>> 3
print((lambda x, y: (x, y))(1, 2)) # >>> (1, 2)
print((lambda **kwargs: kwargs)(A= 1, B =2)) # >>> {'A': 1, 'B': 2}

"""
    三目预算符
    在 Python 中，三目运算符（也称为条件表达式）是一个简洁的条件语句写法，通常用于根据条件选择值。它的基本语法是：
    x if condition else y
        condition 是一个布尔表达式。
        x 是当条件为 True 时的返回值。
        y 是当条件为 False 时的返回值
"""
a = 10
b = 20
print("a < b") if a < b else print("a > b")

